#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>

int main()
{
    //close(0);
    //close(2);
    close(1);   //根据文件描述符fd的分配规则，新的fd一定是1，但是没有打印！
    //这是因为C语言库函数中封装的printf有关，printf->stdout->1 虽然不再指向对应的显示器了，但是已经指向了log.txt的底层struct file对象
    
    int fd = open("log.txt",O_WRONLY,O_CREAT,O_TRUNC,0666);
    if(fd < 0)
    {
      perror("open");
      return 1;
    }

    printf("fd: %d\n",fd);

    //如果想要打印fd=1,就要fflush， 这与缓冲区有关！
    fflush(stdout);
    close(fd);






















    //先验证0,1,2就是标准I/O
    //char buffer[1024];
    //ssize_t s = read(0,buffer,sizeof(buffer)-1);
    //if( s > 0 )
    //{
    //  buffer[s] = '\0';
    //  printf("echo: %s",buffer);
    //}
    
    //const char*s = "Test OS interface write\n";
    //write(1,s,strlen(s));
    //write(2,s,strlen(s));
    
    //验证0、1、2和stdin、stdout、stderr的对应关系
    //stdin、stdout、stderr是C语言库函数封装好的系统接口
    //printf("stdin: %d\n",stdin->_fileno);
    //printf("stdout: %d\n",stdout->_fileno);
    //printf("stderr: %d\n",stderr->_fileno);






















  //umask(0);
  ////在之前学习的C语言中的fopen函数，其底层就是open的O_WRONLY | O_CREAT | O_TRUNC 
  ////fopen("log.txt,"w");  底层是open，O_WRONLY | O_CREAT | O_TRUNC
  ////fopen("log.txt,"a");  底层是open，O_WRONLY | O_CREAT | O_APPEND
  ////O_TRUNC是用于清空!
  ////int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);    //对应于C语言中的"w"方式操作！
  ////int fd = open("log.txt",O_WRONLY | O_CREAT | O_APPEND,0666);      //对应于C语言中的"a"方式操作！
  ////int fd = open("log.txt",O_RDONLY);      //对应于C语言中的"r"方式操作！
  ////测试文件描述符：fd
  //int fda = open("log.txta",O_WRONLY | O_CREAT | O_TRUNC,0666);    
  //int fdb = open("log.txtb",O_WRONLY | O_CREAT | O_TRUNC,0666);
  //int fdc = open("log.txtc",O_WRONLY | O_CREAT | O_TRUNC,0666);    
  //int fdd = open("log.txtd",O_WRONLY | O_CREAT | O_TRUNC,0666);    
  //int fde = open("log.txte",O_WRONLY | O_CREAT | O_TRUNC,0666);    
 
  //printf("fda: %d\n",fda);
  //printf("fdb: %d\n",fdb);
  //printf("fdc: %d\n",fdc);
  //printf("fdd: %d\n",fdd);
  //printf("fde: %d\n",fde);
 
  ////if(fd < 0)
  ////{
  ////  perror("open");
  ////  return 1;
  ////}
  ////printf("fd:%d \n",fd);

  ////char buffer[128];
  ////ssize_t s = read(fd,buffer,sizeof(buffer)-1);   //sizeof(buffer)-1是为了使得读取的内容形成字符串（字符串以\0结尾）
  ////if(s > 0)
  ////{
  ////  buffer[s]='\0';        //因为系统调用接口read中的接收类型为void*，因此既可以是二进制，也可以是字符等，这里将其下标最后一个字符置为\0
  ////  printf("%s",buffer);
  ////}

  ////int cnt = 0;
  //////const char* str="This is a test for linux file!\n";
  ////const char* str="AAAAAA!\n";
  ////while(cnt < 2)
  ////{
  ////  //write(fd,str,strlen(str)+1);  //+1导致乱码！
  ////  write(fd,str,strlen(str));
  ////  cnt++;
  ////}

  ////close(fd);
  return 0;
}
